package com.ipartek.formacion.bean.url;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import com.ipartek.formacion.beans.Persona;

/**
 * Se conecta una URL para descargarse su codigo a un fichero para parsearlo y
 * extraer la informacion querida. A la hora de mandarle la pagina web hay que
 * incluirle el protocolo. Ejemplo: http://www.contoso.com
 * 
 */
public class ParsearHTML {

	private String paginaWeb;

	private String divInicio;
	private String divFinal;
	private String ridername;
	private String span;

	// Logger para la gestion de los archivos de log.
	Logger log;

	// Variables para el manejo de los ficheros

	File archivoHTML = null;
	final String FICHEROWEB = "data/informacion.txt";

	// CONSTRUCTORES
	/**
	 * Constructor vacio
	 */
	public ParsearHTML() {
		super();
		PropertyConfigurator.configure("config/log4j.properties");
		log = Logger.getLogger(this.getClass().getName());
		this.setPaginaWeb("");
		this.setDivInicio("");
		this.setDivFinal("");
		this.setRidername("");
		this.setSpan("");
	}

	/**
	 * Constructor con parametros
	 * 
	 * @param paginaWeb
	 */
	public ParsearHTML(String paginaWeb, String divInicio, String divFinal,
			String ridername, String span) {
		this();
		// log = Logger.getLogger(this.getClass().getName());
		this.setPaginaWeb(paginaWeb);
		this.setDivInicio(divInicio);
		this.setDivFinal(divFinal);
		this.setRidername(ridername);
		this.setSpan(span);
	}

	// GETTERS & SETTERS
	public String getPaginaWeb() {
		return paginaWeb;
	}

	public void setPaginaWeb(String paginaWeb) {
		this.paginaWeb = paginaWeb.trim();
	}

	public String getDivInicio() {
		return divInicio;
	}

	public void setDivInicio(String divInicio) {
		this.divInicio = divInicio.trim();
	}

	public String getDivFinal() {
		return divFinal;
	}

	public void setDivFinal(String divFinal) {
		this.divFinal = divFinal.trim();
	}

	public String getRidername() {
		return ridername;
	}

	public void setRidername(String ridername) {
		this.ridername = ridername.trim();
	}

	public String getSpan() {
		return span;
	}

	public void setSpan(String span) {
		this.span = span.trim();
	}

	// METODOS
	/**
	 * Parsea la URL que tenemos en el atributo.
	 * 
	 * @see <a
	 *      href="http://jconnexion.blogspot.com.es/2011/11/crear-una-pagina-html-con-java.html">Escribir
	 *      bien una pagina web con java</a>
	 */

	public void parseoHTML() {
		URL aURLInterno = null;

		try {
			archivoHTML = new File(FICHEROWEB);
			Date date = new Date();

			if (!archivoHTML.exists()) {
				aURLInterno = new URL(this.getPaginaWeb());
				descargar();
			} else {
				long diff = date.getTime() - archivoHTML.lastModified();
				long diffM = diff / (60 * 1000);
				if (diffM > 60) {
					descargar();
				}
			}

			StringBuffer stgBuffer = leerFichero();

			int posicionInicial = 0;
			int posicionFinal = 0;

			posicionInicial = stgBuffer.indexOf(this.getDivInicio());
			posicionFinal = stgBuffer.indexOf(this.getDivFinal());

			String divEntero = stgBuffer.substring(posicionInicial,
					posicionFinal);

			// Remplaza cadena ridername por %
			String textoReplace = divEntero
					.replaceAll(this.getRidername(), "%");
			// Remplaza cadena span por &
			textoReplace = textoReplace.replaceAll(this.getSpan(), "&");

			// Almacenar en un array el texto a partir del caracter %
			String[] textoRecortado = textoReplace.split("%");

			// Crear arrayLIst de la clase Persona

			String nombre;
			ArrayList<Persona> surferos = new ArrayList<Persona>();
			Persona surfer;

			// Recorre array desde la posicion 1 y almacenarlo en el
			// Arraylist
			for (int i = 1; i < textoRecortado.length; i++) {
				surfer = new Persona();
				nombre = textoRecortado[i].substring(0,
						textoRecortado[i].indexOf("&"));
				String[] separador;
				separador = nombre.split(" ");

				surfer.setNombre(separador[0]);
				surfer.setApellido1(separador[1]);
				surfer.setNacionalidad(separador[2].replace("(", "").replace(
						")", ""));
				surferos.add(surfer);
			}

			// Printa los nombres de los surferos Iterator<Persona> it =

			Iterator<Persona> it = surferos.iterator();
			surferos.iterator();
			while (it.hasNext()) {
				System.out.println(it.next());
			}

			log.info("El fichero " + this.getPaginaWeb() + " esta procesado");

			/*
			 * } catch (MalformedURLException e) {
			 * log.error("[MalformedURLException] -> " + e.getMessage());
			 */
		} catch (IOException e) {
			log.error("[IOException] -> " + e.getMessage());
		} catch (Exception e) {
			log.error("[Exception] -> " + e.getMessage());
		} finally {
			aURLInterno = null;
			LogManager.shutdown();
			try {
				/*
				 * if (pw != null) { pw.close(); } if (br != null) { br.close();
				 * }
				 */
				/*
				 * } catch (IOException e) { log.error("[IOException] -> " +
				 * e.getMessage());
				 */
			} catch (Exception e) {
				log.error("[IOException] -> " + e.getMessage());
			}
		}
	}

	/**
	 * Lee del fichero que nos hemos descargado o pagina web que tenemos en el
	 * HD
	 * 
	 * @return Retorna el 'STRINGBUFFER' con toda la cadena.
	 */
	private StringBuffer leerFichero() {
		BufferedReader br = null;
		StringBuffer stgBuffer = null;
		String inputLine;
		try {
			br = new BufferedReader(new FileReader(FICHEROWEB));

			stgBuffer = new StringBuffer();
			while ((inputLine = br.readLine()) != null) {
				stgBuffer.append(inputLine);
			}

			log.info("Fichero leido correctamente");

		} catch (FileNotFoundException e) {
			log.error("[IOException] -> " + e.getMessage());
		} catch (Exception e) {
			log.error("[Exception] -> " + e.getMessage());
		} finally {
			LogManager.shutdown();
			return stgBuffer;
		}
	}

	/**
	 * Descarga la 'URL' a un fichero de texto para despues procesarlo.
	 * 
	 */
	private void descargar() {
		URL aURLInterno;

		String inputLine;
		BufferedReader br = null;
		PrintWriter pw = null;

		try {
			aURLInterno = new URL(this.getPaginaWeb());

			br = new BufferedReader(new InputStreamReader(
					aURLInterno.openStream()));
			if (archivoHTML == null) {
				archivoHTML = new File(FICHEROWEB);
			}
			pw = new PrintWriter(new FileWriter(archivoHTML));
			while ((inputLine = br.readLine()) != null) {
				pw.println(inputLine);
				pw.flush();
			}
			log.info("El fichero " + this.getPaginaWeb() + " esta descargado");

		} catch (MalformedURLException e) {
			log.error("[MalformedURLException] -> " + e.getMessage());
		} catch (FileNotFoundException e) {

			log.error("[FileNotFoundException] -> " + e.getMessage());
		} catch (Exception e) {

			log.error("[Exception] -> " + e.getMessage());

		} finally {
			aURLInterno = null;
			try {
				if (pw != null) {
					pw.close();
				}
				if (br != null) {
					br.close();
				}
			} catch (IOException e) {
				log.error("[IOException] -> " + e.getMessage());
			}
		}
	}
}
